﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Autofac;
using Autofac.Extras.DynamicProxy2;
using EyFramework.Common;
using Module = Autofac.Module;

namespace Insurance.Core
{
    /// <summary>
    /// 系统模块注册
    /// </summary>
    public class ModuleInsurance : Module
    {
        /// <summary>
        /// 注册所有的系统模块使用的服务和Dao
        /// </summary>
        /// <param name="builder"></param>
        protected override void Load(ContainerBuilder builder)
        {
            var coreAssembly = Assembly.Load("Insurance.Core");
            builder.Register(c => new CallLogger());
            //根据名称约定（服务层的接口和实现均以Service结尾），实现服务接口和服务实现的依赖
            var registerBuilder = builder.RegisterAssemblyTypes(coreAssembly)
                .Where(t => t.Name.EndsWith("Service"))
                .AsImplementedInterfaces();
            //Debug模式运行时，才启用AOP日志拦截，记录入参与出参及函数运行时间
            if (Globals.appConfigure.CurrentConfig["Application"]["RunMode"] == Constants.RUNMODE_DEBUG)
            {
                registerBuilder.InterceptedBy(typeof(CallLogger))
                    .EnableInterfaceInterceptors();//把该具体实现类注册为它的所有接口
            }
            //根据名称约定（数据访问层的接口和实现均以Dao结尾），实现数据访问接口和数据访问实现的依赖
            builder.RegisterAssemblyTypes(coreAssembly)
                .Where(t => t.Name.EndsWith("Dao"))
                .AsImplementedInterfaces();//把该具体实现类注册为它的所有接口
        }
    }
}